package com.longge;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * @创建人 xinglongge
 * @创建时间 2021/7/16
 * @描述
 */
public class DiffWaysToCompute {
    HashMap<String, List<Integer>> memory = new HashMap<>();

    public List<Integer> diffWaysToCompute(String expression) {
        List<Integer> memo = memory.get(expression);
        if (memo != null) return memo;
        List<Integer> res = new ArrayList<>();
        for (int i = 0; i < expression.length(); i++) {
            char c = expression.charAt(i);
            if (c == '+' || c == '-' || c == '*') {
                //-------------------------------分
                // 以运算符为中心，分割成两个字符串，分别递归计算
                List<Integer> left = diffWaysToCompute(expression.substring(0, i));
                List<Integer> right = diffWaysToCompute(expression.substring(i + 1));
                //-------------------------------治
                // 通过子问题的结果，合成原问题的结果
                for (Integer l : left) {
                    for (Integer r : right) {
                        if (c == '+') res.add(l + r);
                        if (c == '-') res.add(l - r);
                        if (c == '*') res.add(l * r);
                    }
                }
            }
        }
        if (res.isEmpty()) {
            res.add(Integer.parseInt(expression));
        }
        memory.put(expression, res);
        return res;
    }
}
